package com.leapp.sk.util

import android.content.Context
import android.os.Environment
import java.io.File
import java.math.BigDecimal


/**
 * 缓存清理
 * @author  chaohaipeng  on 2018/8/8.
 */
@Throws(Exception::class)
fun getTotalCacheSize(context: Context?): String {
    var cacheSize = getFolderSize(context?.getCacheDir())
    if (Environment.getExternalStorageState().equals(
            Environment.MEDIA_MOUNTED)) {
        cacheSize += getFolderSize(context?.getExternalCacheDir())
    }
    return getFormatSize(cacheSize.toDouble())
}

/**
 * 清理所有缓存
 */
fun clearAllCache(context: Context?) {
    deleteDir(context?.getCacheDir())
    if (Environment.getExternalStorageState().equals(
            Environment.MEDIA_MOUNTED)) {
        deleteDir(context?.getExternalCacheDir())
    }
}

/**
 * 删除文件
 */
private fun deleteDir(dir: File?): Boolean {
    if (dir != null && dir!!.isDirectory()) {
        val children = dir!!.list()
        for (i in children.indices) {
            val success = deleteDir(File(dir, children[i]))
            if (!success) {
                return false
            }
        }
    }
    return dir!!.delete()
}


// 获取文件
// Context.getExternalFilesDir() --> SDCard/Android/data/你的应用的包名/files/
// 目录，一般放一些长时间保存的数据
// Context.getExternalCacheDir() -->
// SDCard/Android/data/你的应用包名/cache/目录，一般存放临时缓存数据
@Throws(Exception::class)
fun getFolderSize(file: File?): Long {
    var size: Long = 0
    try {
        val fileList = file?.listFiles()
        if (fileList!=null){
            for (i in fileList.indices) {
                // 如果下面还有文件
                if (fileList[i].isDirectory()) {
                    size = size + getFolderSize(fileList[i])
                } else {
                    size = size + fileList[i].length()
                }
            }
        }

    } catch (e: Exception) {
        e.printStackTrace()
    }

    return size
}

/**
 * 格式化单位
 *
 * @param size
 * @return
 */
fun getFormatSize(size: Double): String {
    val kiloByte = size / 1024
    if (kiloByte < 1) {
        // return size + "Byte";
        return "0K"
    }


    val megaByte = kiloByte / 1024
    if (megaByte < 1) {
        val result1 = BigDecimal(java.lang.Double.toString(kiloByte))
        return result1.setScale(2, BigDecimal.ROUND_HALF_UP)
                .toPlainString() + "KB"
    }


    val gigaByte = megaByte / 1024
    if (gigaByte < 1) {
        val result2 = BigDecimal(java.lang.Double.toString(megaByte))
        return result2.setScale(2, BigDecimal.ROUND_HALF_UP)
                .toPlainString() + "MB"
    }


    val teraBytes = gigaByte / 1024
    if (teraBytes < 1) {
        val result3 = BigDecimal(java.lang.Double.toString(gigaByte))
        return result3.setScale(2, BigDecimal.ROUND_HALF_UP)
                .toPlainString() + "GB"
    }
    val result4 = BigDecimal(teraBytes)
    return result4.setScale(2, BigDecimal.ROUND_HALF_UP).toPlainString() + "TB"
}